// 对入参和返回进行声明
function sum(x: number, y: number): number {
    return x + y;
}

// 输入多余的（或者少于要求的）参数，是不被允许的
// sum(1, 2, 3); //error


// 函数表达式 写法
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
    return x + y;
};


// 用接口定义函数的形状
interface SUM {
    (firstNum: number, secondNum: number): number
}

let sum1: SUM
sum1 = (firstNum: number, secondNum: number) => firstNum + secondNum

// 可选参数  必须放在必填参数后面
// function buildName(firstName: string, lastName?: string) {
//     if (lastName) {
//         return firstName + ' ' + lastName;
//     } else {
//         return firstName;
//     }
// }
// let tomcat = buildName('Tom', 'Cat');
// let tom = buildName('Tom');



// 默认参数
function buildName(firstName: string, lastName: string = 'Cat') {
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let Tom = buildName('Tom');
//此时就不受「可选参数必须接在必需参数后面」的限制了：



// 重载
// 重载允许一个函数接受不同数量或类型的参数时，作出不同的处理。
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    }
    return x.split('').reverse().join('');
}

